const fs = require('fs');
const path = require('path');

// 配置
const API_DIR = './src/api';
const OUTPUT_FILE = './API接口文档.md';

// 接口分类
const API_CATEGORIES = {
  'login.js': '用户认证',
  'menu.js': '菜单管理',
  'system/user.js': '用户管理',
  'system/role.js': '角色管理',
  'system/menu.js': '菜单管理',
  'system/dept.js': '部门管理',
  'system/post.js': '岗位管理',
  'system/dict/': '字典管理',
  'system/config.js': '系统配置',
  'system/notice.js': '通知公告',
  'system/adv.js': '广告管理',
  'system/article.js': '文章管理',
  'system/alertLog.js': '告警日志',
  'system/monitor.js': '系统监控',
  'system/greenhouse.js': '大棚管理',
  'system/ghMonitor.js': '大棚监测',
  'system/deviceInfo.js': '设备信息',
  'system/environment.js': '环境管理',
  'system/exhaustSchedule.js': '排风调度',
  'system/acwUser.js': 'ACW用户',
  'monitor/': '系统监控',
  'tool/': '系统工具'
};

// 解析API文件
function parseApiFile(filePath) {
  const content = fs.readFileSync(filePath, 'utf8');
  const apis = [];

  // 匹配export function
  const functionRegex = /export\s+function\s+(\w+)\s*\([^)]*\)\s*\{[\s\S]*?return\s+request\s*\(\s*\{[\s\S]*?url:\s*['"`]([^'"`]+)['"`][\s\S]*?method:\s*['"`]([^'"`]+)['"`][\s\S]*?\}/g;

  let match;
  while ((match = functionRegex.exec(content)) !== null) {
    const functionName = match[1];
    const url = match[2];
    const method = match[3];

    // 提取注释
    const beforeFunction = content.substring(0, match.index);
    const lines = beforeFunction.split('\n').reverse();
    let comment = '';

    for (let line of lines) {
      line = line.trim();
      if (line.startsWith('//')) {
        comment = line.substring(2).trim();
        break;
      } else if (line === '') {
        continue;
      } else {
        break;
      }
    }

    apis.push({
      name: functionName,
      comment: comment,
      url: url,
      method: method.toUpperCase()
    });
  }

  return apis;
}

// 递归扫描目录
function scanDirectory(dirPath, basePath = '') {
  const files = fs.readdirSync(dirPath);
  const results = [];

  for (const file of files) {
    const fullPath = path.join(dirPath, file);
    const relativePath = path.join(basePath, file);
    const stat = fs.statSync(fullPath);

    if (stat.isDirectory()) {
      results.push(...scanDirectory(fullPath, relativePath));
    } else if (file.endsWith('.js')) {
      const apis = parseApiFile(fullPath);
      if (apis.length > 0) {
        results.push({
          file: relativePath,
          apis: apis
        });
      }
    }
  }

  return results;
}

// 生成Markdown文档
function generateMarkdown(apiData) {
  let markdown = `# 智能大棚环境监测系统 - API接口文档

## 概述

本文档描述了智能大棚环境监测系统的所有API接口。

### 基础信息

- **基础URL**: \`process.env.VUE_APP_BASE_API\`
- **认证方式**: Bearer Token
- **请求格式**: JSON
- **响应格式**: JSON

### 通用响应格式

\`\`\`json
{
  "code": 200,
  "msg": "操作成功",
  "data": {}
}
\`\`\`

### 状态码说明

| 状态码 | 说明 |
|--------|------|
| 200 | 成功 |
| 401 | 未授权/登录过期 |
| 500 | 服务器错误 |

---

`;

  // 按分类组织API
  const categorizedApis = {};

  for (const fileData of apiData) {
    let category = '其他';

    // 查找匹配的分类
    for (const [pattern, catName] of Object.entries(API_CATEGORIES)) {
      if (fileData.file.includes(pattern)) {
        category = catName;
        break;
      }
    }

    if (!categorizedApis[category]) {
      categorizedApis[category] = [];
    }

    categorizedApis[category].push(fileData);
  }

  // 生成分类文档
  for (const [category, files] of Object.entries(categorizedApis)) {
    markdown += `## ${category}\n\n`;

    for (const fileData of files) {
      markdown += `### ${fileData.file}\n\n`;

      for (const api of fileData.apis) {
        markdown += `#### ${api.comment || api.name}\n\n`;
        markdown += `- **接口名称**: \`${api.name}\`\n`;
        markdown += `- **请求方法**: \`${api.method}\`\n`;
        markdown += `- **接口地址**: \`${api.url}\`\n\n`;

        // 根据方法类型添加参数说明
        if (api.method === 'GET') {
          markdown += `**请求参数**:\n\n`;
          markdown += `| 参数名 | 类型 | 必填 | 说明 |\n`;
          markdown += `|--------|------|------|------|\n`;
          markdown += `| query | object | 否 | 查询参数 |\n\n`;
        } else if (api.method === 'POST' || api.method === 'PUT') {
          markdown += `**请求参数**:\n\n`;
          markdown += `| 参数名 | 类型 | 必填 | 说明 |\n`;
          markdown += `|--------|------|------|------|\n`;
          markdown += `| data | object | 是 | 请求体数据 |\n\n`;
        } else if (api.method === 'DELETE') {
          markdown += `**请求参数**:\n\n`;
          markdown += `| 参数名 | 类型 | 必填 | 说明 |\n`;
          markdown += `|--------|------|------|------|\n`;
          markdown += `| id | string/number | 是 | 记录ID |\n\n`;
        }

        markdown += `**响应示例**:\n\n`;
        markdown += `\`\`\`json\n{\n  "code": 200,\n  "msg": "操作成功",\n  "data": {}\n}\n\`\`\`\n\n`;
        markdown += `---\n\n`;
      }
    }
  }

  return markdown;
}

// 主函数
function main() {
  console.log('开始扫描API文件...');

  if (!fs.existsSync(API_DIR)) {
    console.error(`API目录不存在: ${API_DIR}`);
    return;
  }

  const apiData = scanDirectory(API_DIR);

  if (apiData.length === 0) {
    console.log('未找到API文件');
    return;
  }

  console.log(`找到 ${apiData.length} 个API文件`);

  const markdown = generateMarkdown(apiData);

  fs.writeFileSync(OUTPUT_FILE, markdown, 'utf8');

  console.log(`API文档已导出到: ${OUTPUT_FILE}`);
  console.log(`总共包含 ${apiData.reduce((sum, file) => sum + file.apis.length, 0)} 个接口`);
}

// 运行脚本
main();